package zx.lrn.notes.basic_grammer;

import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.WeakHashMap;

/**
 * @ClassName: WeakReferenceLrn
 * @Description: 弱引用学习 正常情况下，当垃圾回收器发现一个对象没有他人引用了，就会将其回收，然而，当一个对象只被弱引用引用时，垃圾回收器也会将其回收
 *               在WeakHashMap中，K会被采用弱引用保存，当一个K不再被他人引用，即使此K仍被WeakHashMap引用，但在垃圾回收时，仍会将此K及其V一并回收
 * @Author: zhaoxuan
 * @Date: 2020/3/5 23:45
 **/
public class WeakReferenceLrn {
    public static void main(String[] args) {
        String str = new String("123");
        WeakReference<String> weakRef = new WeakReference<>(str);
        str = null; // str不再引用new String("123"),new String("123")只被一个弱引用引用
        System.gc(); // 主动触发垃圾回收
        System.out.println(weakRef.get()); // new String("123")已被回收

        Map<String, String> weakMap = new WeakHashMap<>();
        String k1 = new String("k1");
        String k2 = new String("k2");
        weakMap.put(k1, "v1");
        weakMap.put(k2, "v2");
        k1 = null; // 除weakMap外，new String("k1")已无他人引用，将被回收，new String("k2") 仍被k2引用
        System.gc();
        System.out.println(weakMap);
    }
}
